/**
 * EventList：基础数据结构组件，组合使用，不可继承。
 * 该组件实现了基础序列化与反序列化，并与 EventFileDriver 组合使用。
 *
 * EventList 继承自 EventNode
 */
#pragma once

#include "EventRaw.h"

enum
{
	EVENT_LIST_SUCCESS	    = 0,
	EVENT_LIST_TYPE_ERROR	    = 1,
	EVENT_LIST_IMCOMPLETE_ERROR = 2,
	EVENT_LIST_PARSER_ERROR	    = 3,
	//
	EVENT_LIST_RELOAD      = 10,
	EVENT_LIST_END_OF_DATA = 11,
};

/* 链表-序列化构造对象 */
typedef struct _EventList EventList;
#define EVENT_LIST(any) ((EventList *)any)

extern EventList *event_list_new(void);

/**
 * 从原始 raw List 数据中解析出 EventList 数据结构。
 * 头节点保存了原始数据大小，以及节点数目。
 */
extern EventList *event_list_new_with_raw(const epointer raw);

/**
 * 从 EventList 对象序列化为 EventRaw 数据，
 * 执行前无需调用 event_list_refresh
 */
extern EventRaw *event_list_export_raw(EventList *list);

/**
 * 向空的 EventList 头节点添加数据
 *
 * @param data : 请注意，EventList 将会接管该 data，在析构时会
 *               调用 destory 钩子。
 */
extern void event_list_add_data(EventList *self, epointer data, EventType type,
				void (*destory)(epointer));

/**
 * @brief 从 EventList 中删除某个节点(根据节点的 value)
 *        传入 EventList 头节点的二重指针
 */
extern void event_list_remove_data(EventList **head_2p, epointer data);

/**
 * 刷新 EventList 的 list_num 和 data_size
 *
 * @return 返回全链数据结构的大小
 */
extern euint32 event_list_refresh(EventList *self);

/**
 * 获取 List 节点的类型
 */
extern EventType event_list_get_node_type(EventList *this_node);

/**
 * 验证 EventList 的类型是否符合
 * @return 类型正确返回 true，类型错误或空对象返回 false
 */
extern bool event_list_verify_node_type(const EventList *this_node,
					EventType	 v_type);

/**
 * Debug 使用: 打印 EventList。
 */
extern void event_list_print(const EventList *self);
